/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agen.util;

import java.util.Arrays;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

/**
 *
 * @author juan
 */
public class AHPTableModel extends AbstractTableModel implements TableModel {

    private String[][] matriz;
    private double[][] matrizParaCalculo;          /*maniente los valores random asignados
    a cada celda*/

    public boolean completandoConRandom;

    public double[][] getMatrizParaCalculo() {
        return matrizParaCalculo;
    }
    private Object[] columnNames;

    public void setMatriz(String[][] matriz) {
        this.matriz = matriz;
        matrizParaCalculo = new double[matriz.length][matriz[0].length - 1];
        columnNames = new String[matriz[0].length];
        for (int i = matriz.length - 1; i >= 0; i--) {
            Arrays.fill(matriz[i], "");//evitamos NullPointer asi.
            Arrays.fill(matrizParaCalculo[i], 0.0);
            matriz[i][0] = "Cr " + (char) ((char) (i % 26) + 'A');
            columnNames[i + 1] = "Cr " + (char) ((char) (i % 26) + 'A');
            matriz[i][i + 1] = "1";
            matrizParaCalculo[i][i] = 1;
        }
        columnNames[0] = "AHP";
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col].toString();
    }

    public int getRowCount() {
        return matriz.length;
    }

    public int getColumnCount() {
        return matriz[0].length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return matriz[rowIndex][columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex != rowIndex + 1) {
            return true;
        }
        return false;
    }

    /**
     * Para la tabla MultiCriterio los valores posiles son:
     *  + en la columna 0: los nombres de los criterios
     *  + en las demas:
     *      + valores float con prioridades.
     *      + Strings "¿?" indicando incognita.
     *      + Strings "" indicando que el usuario no completo la celda ni la marcó
     *      como incognita.
     * Ademàs aquí se mantiene la matriz matrizParaCalculo que contiene una 
     * representación en float de los strings convertibles a float en la tabla, 
     * sin incluir la columna 0. Y 0 para los strings "" y los "¿?".
     * @param prioridad
     * @param rowIndex
     * @param columnIndex
     */
    @Override
    public void setValueAt(Object prioridad, int rowIndex, int columnIndex) {

        if (columnIndex == 0) {
            String criterio = (String) prioridad;
            matriz[rowIndex][columnIndex] = criterio;
            columnNames[rowIndex + 1] = criterio;
            fireTableStructureChanged();
        } else {
            //completar la matrizparacalculo
            if (prioridad.equals("¿?")) {
                matriz[rowIndex][columnIndex] = (String) prioridad;
                matriz[columnIndex - 1][rowIndex + 1] = (String) prioridad;
                fireTableCellUpdated(rowIndex, columnIndex);
                fireTableCellUpdated(columnIndex - 1, rowIndex + 1);
            } else {
                try {
                    Float prio = -10F;
                    if (!completandoConRandom) {
                        if (((String) prioridad).contains("/")) {
                            String[] fraccion = ((String) prioridad).split("/");
                            if (fraccion.length == 2) {
                                int intDenominador = Integer.parseInt(fraccion[1]);
                                int intNumerador = Integer.parseInt(fraccion[0]);
                                if (intNumerador == 1 && intDenominador > 1 &&
                                        intDenominador < 10) {
                                    /*fraccion valida*/
                                    prio = (float) 1 / (float) intDenominador;
                                } else {
                                    throw new NumberFormatException("Numerador o Denominador fuera del intervalo.");
                                }
                            } else {
                                throw new NumberFormatException("no hay una sóla barra divisoria.");
                            }
                        } else {
                            int intNumerador = Integer.parseInt((String) prioridad);
                            if (intNumerador > 1 && intNumerador < 10) {
                                /*entero valido*/
                                prio = (float) intNumerador;
                            } else {
                                throw new NumberFormatException("El entero esta fuera del intervalo.");
                            }
                        }
                    }else{
                        prio = Float.parseFloat((String)prioridad);
                    }

                    if (prio > 1) {
                        matriz[rowIndex][columnIndex] = Float.toString(prio);
                        matriz[columnIndex - 1][rowIndex + 1] = "1 / " + Float.toString(prio);
                        matrizParaCalculo[rowIndex][columnIndex - 1] = prio;
                        matrizParaCalculo[columnIndex - 1][rowIndex] = 1 / prio;
                    } else {
                        matriz[rowIndex][columnIndex] = "1 / " + Float.
                                toString(Math.round(1 / prio));
                        matriz[columnIndex - 1][rowIndex + 1] = Float.toString(
                                Math.round(1 / prio));
                        matrizParaCalculo[rowIndex][columnIndex - 1] = prio;
                        matrizParaCalculo[columnIndex - 1][rowIndex] =
                                Math.round(1 / prio);
                    }
                    fireTableCellUpdated(rowIndex, columnIndex);
                    fireTableCellUpdated(columnIndex - 1, rowIndex + 1);

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }

        }

    }
}
